# 导入flask类
# render_template 从 jinjia2的库自动带的
from flask import Flask, request, render_template
from datetime import datetime
# pymysql 连接数据库的驱动, SQLAlchemy 类似jdbc可以简单的操作数据库
from flask_sqlalchemy import SQLAlchemy
import sqlalchemy

app = Flask(__name__)

HOSTNAME = "127.0.0.1"
PORT = 3306
USERNAME = "root"
PASSWORD = "root"
DATABASE = "PearAdminFlask"
app.config["SQLALCHEMY_DATABASE_URI"] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"

# SQLAlchemy 会自动的读取confg中的配置信息
db = SQLAlchemy(app)


class User(db.Model):
    __tablename__ = 'testuser'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(100), nullable=False)
    # 用户关联文章模型,反向输入的数据来自哪个表格
    # article_list = db.relationship("Article",back_populates="test_article")

class Article(db.Model):
    __tablename__ = 'test_article'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.String(200), nullable=False)
    # 这个是外键,关联的是用户的id,  testuser用户表的id字段
    author_id = db.Column(db.Integer, db.ForeignKey('testuser.id'))
    # 关联用户模型,反向输入的数据来自 用户表
    # author = db.relationship("User",back_populates="testuser")
    # 会自动的关联,用户模型,并且添加article_list 的属性来相互的关联
    author = db.relationship("User",backref="article_list")

with app.app_context():
    # 创建所有的表格,将模型映射到数据库
    db.create_all()
    # 获取数据库引擎连接,测试是否可以连接mysql
    with db.engine.connect() as conn:
        # rs = conn.execute("select * from admin_user")
        rs = conn.execute(sqlalchemy.text("select 1"))
        # print(rs.fetchmany())
        print(rs.fetchone())


# 创建路由,返回页面渲染函数
@app.route("/")
def index():
    return render_template("index.html")


# 创建路由,返回页面渲染函数
@app.route("/user/list")
def user_list():
    # 通过id值 来获取数据
    user = User.query.get(2)
    for u in user.article_list:
        print(u)
    return "查询成功"


@app.route("/user/add")
def user_add():
    # 通过id值 来获取数据
    u1 = User(username="张三", password='123')
    u2 = User(username="李四", password='123')
    u3 = User(username="王五", password='123')
    # 添加一个
    db.session.add(u1)
    # 添加迭代对象
    db.session.add_all([u2, u3])
    # 提交添加的数据
    db.session.commit()
    return "添加成功"

@app.route("/user/edit")
def user_edit():
    # 返回的是查询的到的数据数组.first()获取其中的第一项
    u1 = User.query.filter_by(username="王五").first()
    # 直接通过id 来获取数据对象
    u2 = User.query.get(1)

    u1.password = "5555"
    u2.password = "3333"

    # 因为数据已经在session 里边可以直接的提交

    # 提交数据
    db.session.commit()
    return "修改成功"

@app.route("/user/del")
def user_del():
    # 直接通过id 来获取数据对象
    u2 = User.query.get(1)

    db.session.delete(u2)
    # 因为数据已经在session 里边可以直接的提交
    db.session.commit()
    return "删除成功"


@app.route("/article/add")
def article_add():
    # 通过id值 来获取数据
    a1 = Article(title="张三介绍", content='张三是个好同志')
    a2 = Article(title="李四介绍", content='李四是个好同志')

    u2 = User.query.get(2)
    a1.author = u2
    a2.author = u2
    # 添加迭代对象
    db.session.add_all([a1, a2])
    # 提交添加的数据
    db.session.commit()
    return "文章添加成功"



if __name__ == '__main__':
    # debug=True, 开启bug模模式,修改代码数据重新加载,热部署
    # 修改端口,8888
    # 修改host,监听主机名,0.0.0.0 通过ip地址就可以让其他的电脑访问项目
    app.run(host='0.0.0.0', port=5000, debug=True)
